package slw.controls
{
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.getDefinitionByName;
	
	import slw.core.UIComponent;
	
	/**
	 * Label
	 * 标签类，显示文本或图标或两同时显示
	 * @author ddx<br/>
	 * 2011-7-18
	 *
	 */
	public class Label extends UIComponent
	{
		/**
		 * "top"图标位于顶部 
		 */		
		public static const TOP:String="top";
		/**
		 * "bottom"图标位于底部  
		 */		
		public static const BOTTOM:String="bottom";
		/**
		 * "left"图标位于左边 
		 */		
		public static const LEFT:String="left";
		/**
		 * "right"图标位于右边 
		 */		
		public static const RIGHT:String="right";
		//标签文本
		private var _text:String=null;
		//文本与图标间隔
		private var _gap:Number=5;
		//文本
		private var _textField:TextField;
		//图标显示对象
		private var _icon:DisplayObject
		//图标对象类字符串
		private var _iconStr:String=null;
		//图标地址
		private var _iconURL:String=null;
		//图标位置
		private var _position:String="";
		//文本格式
		private var _format:TextFormat;
		//默认文本格式
		private var _defaultFormat:TextFormat;
		//文本颜色
		private var _textColor:uint=0x0;
		/**
		 * 构造函数 
		 * @param text:String="Label" 标签文本
		 * @param icon*=null 标签图标
		 * @param position:String="left" 标签图标位置
		 * 
		 */		
		public function Label(text:String="Label",icon:*=null,position:String=LEFT)
		{
			super();
			this.listName="Label";
			
			init();
			
			setProperties(text,icon,position);
		}
		
		/*
		-----------------------------------
		setters getters
		-----------------------------------
		*/
		//
		/**
		 * 默认文本格式，同TextField.defaultTextFormat
		 * @param value:TextFormat
		 * 
		 */		
		public function set defaultTextFormat(value:TextFormat):void{
			if(_defaultFormat==value){
				return;
			}
			_defaultFormat=value;
			if(_textField!=null)
				_textField.defaultTextFormat=_defaultFormat;
			_format=null;
			
			updateDisplayList();
		}
		//
		/**
		 * 默认文本格式，同TextField.defaultTextFormat
		 * @param value:TextFormat
		 * 
		 */
		public function get defaultTextFormat():TextFormat{
			return _defaultFormat;
		}
		//
		/**
		 * 文本颜色 默认值:0x0
		 * @param value:uint
		 * 
		 */		
		public function set textColor(value:uint):void{
			if(_textColor==value){
				return;
			}
			_textColor=value;
			if(_textField!=null)
				_textField.textColor=_textColor;
		}
		//
		/**
		 * 文本颜色 默认值:0x0
		 * @param value:uint
		 * 
		 */	
		public function get textColor():uint{
			return _textColor;
		}
		//
		/**
		 * 标签文本,默认值:"Label"，设置值为""或null时删除文本对象
		 * @param value:String
		 * 
		 */		
		public function set text(value:String):void{
			if(_text==value){
				return;
			}
			_text=value;
			if(_text==""||_text==null){
				if(_textField!=null)
					this.buildContainer.removeChild(_textField);
				_textField=null;
			}else if(_textField==null){
				_textField=new TextField();
				_textField.autoSize=TextFieldAutoSize.LEFT;
				_textField.textColor=_textColor;
				if(_defaultFormat!=null)
					_textField.defaultTextFormat=_defaultFormat;
				this.buildContainer.addChild(_textField);
			}
			
			updateDisplayList();
		}
		//
		/**
		 * 标签文本,默认值:"Label"，设置值为""或null时删除文本对象
		 * @param value:String
		 * 
		 */
		public function get text():String{
			return _text;
		}
		//
		/**
		 * 标签图标，值为显示对象或显示对象类字符串，设置为null时删除图标,默认值:null
		 * @param value:*
		 * 
		 */		
		public function set icon(value:*):void{
			if(_icon==value||_iconStr==value){
				return;
			}
			if(_icon!=null)
				this.buildContainer.removeChild(_icon);
			
			_icon=null;
			_iconStr=null;
			if(value is String){
				_iconStr=value;
				
				var $c:Class=getDefinitionByName(_iconStr) as Class;
				_icon=new $c();
			}else{
				_icon=value;
			}
			if(_icon!=null){
				this.buildContainer.addChild(_icon);
			}else{
				_iconURL=null;
			}
			
			updateDisplayList();
		}
		//
		/**
		 * 标签图标，值为显示对象或显示对象类字符串，设置为null时删除图标,默认值:null
		 * @param value:*
		 * 
		 */
		public function get icon():*{
			return _icon==null?_iconStr:_icon;
		}
		//
		/**
		 * 图标URL，加载指定资源后，icon属性值设置为加载到的根显示对象(用Loader加载,参看Loader.content属性)
		 * @param value:String
		 * @see <br/>
		 * <a href='http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#contentLoaderInfo' target='_blank'>Loader.content</a>
		 * 
		 */				
		public function set iconURL(value:String):void{
			if(_iconURL==value){
				return;
			}
			_iconURL=value;
			
			var $context:LoaderContext=new LoaderContext();
			$context.applicationDomain=ApplicationDomain.currentDomain;
			var $loader:Loader=new Loader();
			$loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderComplete);
			$loader.load(new URLRequest(_iconURL),$context);
		}
		//
		/**
		 * 图标URL，加载指定资源后，icon属性值设置为加载到的根显示对象(用Loader加载,参看Loader.content属性)
		 * @param value:String
		 * @see <br/>
		 * <a href='http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#contentLoaderInfo' target='_blank'>Loader.content</a>
		 * 
		 */	
		public function get iconURL():String{
			return _iconURL;
		}
		//
		/**
		 * 图标的位置，默认值:Label.LEFT,可能的值为:<br/>
		 * <ul>
		 * 	<li>Label.TOP 图标位于标签顶部<br/>
		 * 	<li>Label.BOTTOM 图标位于标签底部<br/>
		 * 	<li>Label.LEFT 图标位于标签左边<br/>
		 * 	<li>Label.RIGHT 图标位于标签右边<br/>
		 * </ul> 
		 * @param value:String
		 * 
		 */		
		public function set position(value:String):void{
			if(_position==value){
				return;
			}
			_position=value;
			
			updateDisplayList();
		}
		//
		/**
		 * 图标的位置，默认值:Label.LEFT,可能的值为:<br/>
		 * <ul>
		 * 	<li>Label.TOP 图标位于标签顶部<br/>
		 * 	<li>Label.BOTTOM 图标位于标签底部<br/>
		 * 	<li>Label.LEFT 图标位于标签左边<br/>
		 * 	<li>Label.RIGHT 图标位于标签右边<br/>
		 * </ul> 
		 * @param value:String
		 * 
		 */	
		public function get position():String{
			return _position;
		}
		//
		/**
		 * 此属性对此类无意义，始终为默认值 0
		 * @param value:Number
		 * 
		 */		
		override public function set round(value:Number):void{
			
		}
		/*
		-----------------------------------
		public  methods
		-----------------------------------
		*/
		//
		/**
		 * 设置标签文本格式
		 * @param format:TextFormat
		 * 
		 */		
		public function setTextFormat(format:TextFormat):void{
			_format=format;
			
			updateDisplayList();
		}
		/*
		-----------------------------------
		private  methods
		-----------------------------------
		*/
		//初始化
		private function init():void{
			this.mouseChildren=false;
			this.mouseEnabled=false;
		}
		//更新显示
		private function updateDisplayList():void{
			if(_icon!=null){
				_icon.x=0;
				_icon.y=0;
			}
			
			if(_textField!=null){
				_textField.text=_text==null?"":_text;
				
				if(_format!=null)
					_textField.setTextFormat(_format);
				_textField.x=0;
				_textField.y=0;
			}
			if(_icon!=null&&_textField!=null){
				switch(_position){
					case TOP:
						_textField.y=_icon.y+_icon.height+_gap;
						layoutX(_textField,_icon);
						break;
					case BOTTOM:
						_icon.y=_textField.y+_textField.height+_gap;
						layoutX(_textField,_icon);
						break;
					case LEFT:
						_textField.x=_icon.x+_icon.width+_gap;
						layoutY(_textField,_icon);
						break;
					case RIGHT:
						_icon.x=_textField.x+_textField.width+_gap;
						layoutY(_textField,_icon);
						break;
				}
			}
			checkoutSize();
		}
		//设置主要属性
		private function setProperties(text:String,icon:*,position:String):void{
			_position=position;
			this.text=text;
			
			this.icon=icon;
			
			updateDisplayList();
		}
		//x轴对齐
		private function layoutX(...args):void{
			for(var i:int=0;i<args.length;i++){
				if(args[i].width<this.buildContainer.width){
					args[i].x=(this.buildContainer.width-args[i].width)/2;
				}
			}
		}
		//y轴对齐
		private function layoutY(...args):void{
			for(var i:int=0;i<args.length;i++){
				if(args[i].height<this.buildContainer.height){
					args[i].y=(this.buildContainer.height-args[i].height)/2;
				}
			}
		}
		//加载资源完成
		private function loaderComplete(e:Event):void{
			e.target.removeEventListener(Event.COMPLETE,loaderComplete);
			this.icon=LoaderInfo(e.target).content;
		}
		//检测高宽
		private function checkoutSize():void{
			this.width=this.buildContainer.width;
			this.height=this.buildContainer.height;
		}
	}
}